﻿/*
===========================================================================
Immemorsion LGPL Source code
Copyright trszdev - rahimyanov@gmail.com

This file is part of Immemorsion.

Immemorsion is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Immemorsion is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Immemorsion.  If not, see <http://www.gnu.org/licenses/>.
===========================================================================
*/
using System.Diagnostics;
using System.Collections.Generic;
using System;
using Immemorsion.PlatformApi;

namespace Immemorsion
{
    public class ProcessMemoryClient : IProcessMemoryClient
    {

        private readonly IProcessMemoryWriter ProcessMemoryWriter;
        private readonly IProcessMemoryScanner ProcessMemoryScanner;
        private readonly IProcessMemoryReader ProcessMemoryReader;

        public Process Process { get; private set; }
        public IntPtr ProcessHandle { get; private set; }

        public ProcessMemoryClient(Process process)
        {
            Process = process;
            ProcessMemoryReader = new ProcessMemoryReader(Process);
            ProcessMemoryScanner = new ProcessMemoryScanner(Process);
            ProcessMemoryWriter = new ProcessMemoryWriter(Process);
            ProcessHandle = ProcessMemoryScanner.ProcessHandle;
        }


        public IEnumerable<MemoryAddress> SearchPattern(IByteMemoryPattern memoryPattern, IMemoryRegion memoryRegion)
        {
            return ProcessMemoryScanner.SearchPattern(memoryPattern, memoryRegion);
        }

        public IEnumerable<MemoryAddress> SearchPattern(IByteMemoryPattern memoryPattern)
        {
            return ProcessMemoryScanner.SearchPattern(memoryPattern);
        }

        public bool WriteAddress(MemoryAddress address, byte[] bytes)
        {
            return ProcessMemoryWriter.WriteAddress(address, bytes);
        }

        public byte[] ReadAddress(MemoryAddress memoryAddress, int numBytes)
        {
            return ProcessMemoryReader.ReadAddress(memoryAddress, numBytes);
        }


        public IProcessMemoryHandle GetMemoryHandle(MemoryAddress memoryAddress, int numBytes)
        {
            var result = new ProcessMemoryHandle(ProcessHandle);
            result.BaseAddress = memoryAddress;
            result.Length = numBytes;
            result.Update();
            return result;
        }

        public IProcessMemoryHandle GetMemoryHandle()
        {
            var result = new ProcessMemoryHandle(ProcessHandle);
            return result;
        }
    }
}
